<?php
/**
 * 集合場所クラスモジュール
 */
require_once 'Xml.php';
require_once __DIR__ . '/../Controller.php';
require_once APPLICATION_PATH . '/controllers/StaffController.php';

/**
 * 集合場所クラス
 * @author admin
 *
 */
class Models_Place_Xml_Controller extends Lib_Abstract_Xml
{
	/***
	 * XMLタグキー
	 */
	/** シーケンスＩＤ */
	const KEY_ID		= 'ID';
	/** 名称 */
	const KEY_NAME		= 'NAME';
	/** 地図サービスサイトＵＲＬ */
	const KEY_MAPURL	= 'MAPURL';

	/**
	 * 集合場所クラスコンストラクタ
	 * @param $strFileName データファイル名
	 */
	public function __construct( $strFileName='test.xml' )
	{
		/***
		 * データファイル名指定にフォルダー指定がない場合
		 * カレントディレクトリを付加する
		 */
		if ( dirname( $strFileName ) == '.' ) {
			$strFileName = $this->getDefaultSavePath() . $strFileName;
		}
		parent::__construct( $strFileName );
	}

	/**
	 * マップＩＤからレコード検索
	 * @param マップＩＤ $mapId
	 */
	public function getDataById($mapId)
	{
		$aryResult = FALSE;
		foreach($this->_aryXml['LIST'] as $Data){
			if ($Data[self::KEY_ID] == $mapId){
				$aryResult = $Data;
			}
		}
		return $aryResult;
	}

	/**
	 * カレント保存フォルダーパスに当該ソースのパスを返す
	 */
	public static function getDefaultSavePath()
	{
		$strResult = dirname( __FILE__ ) . '/databox/';
		$accountFolder = Models_Controller::getFolder();
		/*** アカウントフォルダー指定で当該フォルダーが未作成（新規アカウント）の場合造る */
		if ($accountFolder != '') {
			$strResult .= $accountFolder;
			/*** アカウントフォルダーがない */
			if (!file_exists($strResult)){
				/*** スタッフアカウント限定 */
				if (StaffController::isLogined()) {
					/*** フォルダー作成失敗判定 */
					if (!mkdir($strResult)){
						return FALSE;
					}
				}
			}
		}
		return $strResult;
	}

	/**
	 * シーケンスＩＤを生成する
	 */
	public static function createId()
	{
		$aryDivide = explode( ' ', microtime() );
		$iResult = $aryDivide[0] + $aryDivide[1];
		return $iResult;
	}

	/**
	 * データ保存用連想配列を生成する
	 * @param $ary 生成返却用バッファ
 	 * @param $strName 名称
	 * @param $strMapurl 地図サービスサイトＵＲＬ
	 * @param $strId シーケンスＩＤ
	 */
	public static function modifyData(
		&$ary,
		$strName,
		$strMapurl,
		$strId
	)
	{
		$ary = array(
			self::KEY_ID => $strId,
			self::KEY_NAME => $strName,
			self::KEY_MAPURL => $strMapurl
		);
	}

	/**
	 * 指定タグキーの値が一致する連想配列ブロックを返す
	 * @param $strKeyName 検索対象タグキー
	 * @param $strValue 検索対象値
	 */
	public function searchKey( $strKeyName, $strValue )
	{
		$arySrc = $this->_searchStructArray( $this->_aryXml, $strKeyName, $strValue);
		return $arySrc;
	}

	/**
	 * 渡された値でデータを更新する
	 * @param $strName 名称
	 * @param $strMapurl 地図サービスサイトＵＲＬ
	 * @param $strId シーケンスＩＤ
	 */
	public function putData(
		$strName,
		$strMapurl,
		$strId = ''
	)
	{
		/***
		 * シーケンスＩＤが渡されたばあい、一致するブロックを検索する
		 */
		if ( $strId != '' ) {
			$arySrc
			= &$this->_searchStructArray(
				$this->_aryXml,
				self::KEY_ID, $strId
			);
			/**
			 * 判定
			 * 見つからなければ更新
			 * 見つからなければ新規追加
			 */
			if ( $arySrc !== FALSE ) {
				$this->modifyData(
					$arySrc,
					$strName,
					$strMapurl,
					$strId
				);
			} else {
				$aryNew = array();
				$this->modifyData(
					$aryNew,
					$strName,
					$strMapurl,
					$strId
				);
				$this->_aryXml['LIST'][] = $aryNew;
			}
		} else {
			/** シーケンスＩＤが渡されなかった場合は新規追加 */
			$aryNew = array();
			$this->modifyData(
					$aryNew,
					$strName,
					$strMapurl,
					$this->createId()
			);
			$this->_aryXml['LIST'][] = $aryNew;
		}
	}
	
	/**
	 * 保存されている会場の数を返す
	 */
	public function count()
	{
		$iRet = count($this->_aryXml['LIST']);
		return $iRet;
	}

	/**
	 * エントリを削除する
	 * @param $strId 対象エントリシーケンスＩＤ
	 */
	public function delete( $strId )
	{
		$bResult = FALSE;
		$iCount = count($this->_aryXml['LIST']);
		$i = 0;
		/**
		 * シーケンスＩＤを走査し削除する
		 */
		while ( $i < $iCount ) {
			/** シーケンスＩＤ判定 */
			if ( $this->_aryXml['LIST'][$i][self::KEY_ID] == $strId ) {
				unset( $this->_aryXml['LIST'][$i] );
				$bResult = TRUE;
			}
			$i ++;
		}
		return $bResult;
	}

	/**
	 * 事故などで発生したＮＵＬＬレコードを削除する
	 * @see Lib_Abstract_Xml::deleteNullRec()
	 */
	public function deleteNullRec()
	{
		$iCount = count($this->_aryXml['LIST']);
		$i = 0;
		/** 全エントリ走査 */
		while ( $i < $iCount ) {
			/**
			 * シーケンスＩＤのキーエントリが存在しないか
			 * シーケンスＩＤが空の場合削除する
			 */
			if ( !isset($this->_aryXml['LIST'][$i][self::KEY_ID]) ) {
				unset( $this->_aryXml['LIST'][$i] );
			} else if ( trim( $this->_aryXml['LIST'][$i][self::KEY_ID] ) == '' ) {
				unset( $this->_aryXml['LIST'][$i] );
			}
			$i ++;
		}
	}

	/**
	 * 強制配列化エントリのキー名称を設定する
	 * @see Lib_Abstract_Xml::_setForceEnum()
	 */
	public function _setForceEnum()
	{
		$this->_aryForceEnum = array( 'LIST' );
	}

	/**
	 * データの並びを一つ上にする
	 * @param $strId 対象エントリのシーケンスＩＤ
	 */
	public function upOrder($strId)
	{
		$iCount = count($this->_aryXml['LIST']);
		$i = 0;
		/** 全エントリ走査 */
		while ( $i < $iCount ) {
			/** シーケンスＩＤ判定 */
			if ( $this->_aryXml['LIST'][$i][self::KEY_ID] == $strId ) {
				/***
				 * 先頭エントリの場合入れ替えができないので
				 * ＦＡＬＳＥ
				 */
				if ($i == 0) {
					return FALSE;
				}
				/***
				 * 前後を入れ替える
				 */
				$aryPreXmlData = $this->_aryXml['LIST'][$i-1];
				$this->_aryXml['LIST'][$i-1] = $this->_aryXml['LIST'][$i];
				$this->_aryXml['LIST'][$i] = $aryPreXmlData;
				/** 入れ替えたら終了 */
				return TRUE;
			}
			$i ++;
		}
		/***
		 * カウンターをそうはしてしまった場合はエラー
		 */
		return FALSE;
	}

	/**
	 * データの並びを一つ下にする
	 * @param $strId 対象エントリのシーケンスＩＤ
	 */
	public function downOrder($strId)
	{
		$iCount = count($this->_aryXml['LIST']);
		$i = 0;
		/** 全エントリ走査 */
		while ( $i < $iCount ) {
			/** シーケンスＩＤ判定 */
			if ( $this->_aryXml['LIST'][$i][self::KEY_ID] == $strId ) {
				/**
				 * 最終エントリの場合、入れ替えができないので
				 * ＦＡＬＳＥ
				 */
				if ($i == $iCount - 1) {
					return FALSE;
				}
				/***
				 * 前後を入れ替える
				 */
				$aryXmlData = $this->_aryXml['LIST'][$i+1];
				$this->_aryXml['LIST'][$i+1] = $this->_aryXml['LIST'][$i];
				$this->_aryXml['LIST'][$i] = $aryPreXmlData;
				/** 入れ替えたら終了 */
				return TRUE;
			}
			$i ++;
		}
		/***
		 * カウンターをそうはしてしまった場合はエラー
		 */
		return FALSE;
	}
	
	/**
	 * データセットを全件返却する
	 * @return multitype:|unknown
	 */
	public function getDataset()
	{
		$aryResult = array();
		$dataSet = $this->getArrayData();
		if (!isset($dataSet['LIST'])) {
			return $aryResult;
		}
		if (!is_array($dataSet['LIST'])) {
			return $aryResult;
		}
		$aryResult = $dataSet['LIST'];
		return $aryResult;
	}
}